package com.tx.zlm_replay.service;

import com.tx.zlm_replay.common.Page;
import com.tx.zlm_replay.common.RException;
import com.tx.zlm_replay.config.UserConfig;
import com.tx.zlm_replay.vo.AppAndStream;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * @author tx
 * @version 1.0
 * @date 2024/3/18 14:19
 * @description: zlm 文件服务
 */
@Service
public class ZlmFileService implements FileService{
    @Resource
    private UserConfig userConfig;

    /**
     * 分页查询 app and stream
     *
     * @param page
     * @return
     */
    @Override
    public Page<AppAndStream> getAppAndStreams(Page page) {
        String parentPath = userConfig.getRecord();
        ArrayList<AppAndStream> ans = new ArrayList<>();
        // 获取 所有子文件夹
        List<File> fileList = getFileList(parentPath);
        for (File app : fileList) {
            List<File> streams = getFileList(app.getAbsolutePath());
            for (File stream : streams) {
                BasicFileAttributes lastModify;
                try {
                    lastModify =Files.readAttributes(stream.toPath(),BasicFileAttributes.class);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                AppAndStream appAndStream = AppAndStream.newOne(app.getName(), stream.getName(), new Date(lastModify.lastModifiedTime().toMillis()));
                ans.add(appAndStream);
            }
        }
        page.setData(ans);
        return page;
    }

    /**
     * 获取文件的子文件或子文件夹列表
     * @param sunIsDir 子路径是文件夹吗
     * @param parentPath 路径
     * @return 路径下的所有文件
     */
    @Override
    public List<File> getFileList(String parentPath, boolean sunIsDir) {
        // 判断文件夹是否存在
        boolean isDir = Files.isDirectory(Paths.get(parentPath));
        if(!isDir){
            throw RException.info("文件不存在");
        }
        File parent = new File(parentPath);
        File[] files =sunIsDir ? parent.listFiles(File::isDirectory):parent.listFiles(File::isFile);
        return Arrays.asList(files);
    }

    /**
     * 获取文件的子文件夹列表
     *
     * @param parentPath 路径
     * @return 路径下的所有文件
     */
    @Override
    public List<File> getFileList(String parentPath) {
        return getFileList(parentPath,true);
    }
}
